﻿#ifndef MAINWINDOW_H_
#define MAINWINDOW_H_
#include <QWidget>
#include "ui_Mainwindow.h"
#include <QPainter>

#include <QNetworkRequest>				//HTTP的URL请求管理
#include <QNetworkAccessManager>		//URL的上传管理
#include <QNetworkReply>				//网页回复数据触发信号的类

#include <QEventLoop>					//事件循环事件
#include <QMouseEvent>

#include <QJsonArray>					//用于封装JSON数组
#include <QJsonObject>					//用于封装JSON对象
#include <QJSonDocument>				//

#include <QMediaPlayer>
#include <QAudioOutput>
//#include <QMediaPlaylist>				//qt6中删除了这个类;

#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlRecord>
#include <QSqlQuery>

#include <QMessageBox>
#include <QTime>
#include <math.h>

#include "eventfilterobject.h"			//实现窗口正常移动的类


#include "SsongList.h"
#include <QDir>
#include <QPainter>
#include <QMouseEvent>




static QString kugouSearchApi = "http://mobilecdn.kugou.com/api/v3/search/song?";
static QString kugouDownloadApi = "http://wwwapi.kugou.com/yy/index.php?";




namespace Ui
{
	class Mainwindow;
}


class Mainwindow : public QWidget
{
	Q_OBJECT

private:
	Ui::Mainwindow* ui;

	//网络	播放器	SQLite数据库：
	QNetworkRequest* request;
	QNetworkAccessManager* manager;


	QMediaPlayer* player;
	QAudioOutput* audiooutput;
	//QMediaPlaylist* playlist;

	QSqlDatabase database;

	int num, row;
	bool isLoop = false;



	SsongList m_playList_song;
	bool isLocal = true;

	//bool isResults = false;


	bool isHistory = false;


	bool isSequential = false;

protected:
	//音乐歌曲下载和播放：
	void downloadSong(QString album_id, QString hash);
	//访问HTTP网页：
	void httpAccess(QString url);
	//音乐的hash和album_id的值解析，使用JSON：
	void hashJsonAnalysis(const QByteArray& JsonData);
	//搜素的音乐数据信息JSON解析，接续出真正的音乐文件和歌词：
	QString musicAnalysis(QByteArray);



public:
	Mainwindow(QWidget* parent = nullptr);
	~Mainwindow();

	//总初始化：
	void init();


	//布局初始化：
	void layoutinit();
	//数据库初始化：
	void sqlinit();
	//播放器初始化：
	void playerinit();


	//本地音乐初始化：
	void local_music_init();


signals:
	void finish(QByteArray);
	void lyricShow(QString);


public slots:			//槽函数		只要函数名中的控件名和ui文件中的控件名相同就不用再设置信号槽连接了，直接写槽函数就行
	
	//右上角：
	void on_closeBtn_released();					//关于按钮
	void on_huanfuBtn_released();					//换肤按钮
	void on_minBtn_released();						//最小化按钮
	void on_aboutBtn_released();					//退出按钮


	void on_searchBtn_released();					//搜索歌曲按钮



	//下面：
	void on_sequentialBtn_released();				//循环播放按钮
	void on_preBtn_released();						//上一首按钮
	void on_playBtn_released();						//播放按钮
	void on_nextBtn_released();						//下一首按钮
	void on_loopBtn_released();						//循环按钮


	void on_volumeSlider_valueChanged(int value);	//音量滑块槽函数




	//更新播放的进度条和显示的时间：
	void updateDuration(qint64 value);
	void onPositionChanged(qint64 position);
	//读取网络数据的槽函数：
	void netReply(QNetworkReply* reply);
	//显示歌词的槽函数：
	void lyricTextShow(QString lyrics);



	//播放搜索音乐：
	void playeSearch();
	//播放历史音乐：
	void playerhistory();

public:						//事件响应函数：
	void paintEvent(QPaintEvent* ev)override;
	void mousePressEvent(QMouseEvent* ev)override;         //响应鼠标弹起事件


	bool eventFilter(QObject* obj, QEvent* ev)override;		//事件过滤
};
#endif // !MAINWINDOW_H_
